HibernateD and DDBC - ORM and DB abstraction layer for D
Vadim Lopatin
coolreader.org at gmail.com
Fri Apr 5 00:32:54 PDT 2013
On Thursday, 4 April 2013 at 09:54:48 UTC, Dicebot wrote:
> On Wednesday, 3 April 2013 at 19:07:39 UTC, Vadim Lopatin wrote:
>> I don't see what to simplify in markup like this:
>> ...
>
> You may implement approach similar to one used in vibe.d
> http.rest and http.form modules. Some specific examples are
> described by Jacob, but, in general, in results in 3
> configuration stages:
> 0) No configuration at all, all data is inferred from variable
> names and types according to some sane convention.
> 1) Convention configuration - you chose one convention to use
> for aggregate type introspection at compile-time. Few different
> pre-defined conventions exist.
> 2) Fine configuration using UDAs.
Implemented changes for better convention-over-configuration:
- If no annotations on class level, @Entity is assumed.
- No required annotation for simple properties. Nullability is
deduced from data type
- @Embedded annotation is not needed anymore - it's deduced from
field's class @Embeddable annotation
- If no key field annotations specified in class (@Id,
@Generated, @Generator) - property named "id" (if any) is
considered to be a @Generated primary key.
- For Object fields @ManyToOne is applied by default
- For Object[] or LazyCollection!Object @OneToMany is applied by
default
- @OneToOne and @ManyToOne are required, since cannot be deduced
Following declarations are valid (comments describe ):
// @Entity assumed since no @Embeddable annotation
class User {
long id; // @Generated deduced from field name
string name; // deduced @NotNull
Address address; // deduced @Embedded from annotation of
Address
Customer customer; // deduced @ManyToOne @JoinColumn
// annotation required, otherwise would be deduced as
@OneToMany
@ManyToMany Roles[] roles;
}
@Embeddable // required for Embeddable
class Address {
String zip; // @Null
String state; // @Null
string streetAddress; // @NotNull
}
// @Entity assumed since no @Embeddable annotation
class Customer {
int id; // @Generated primary key - from field name
string name;// @NotNull
Long flags; // @Null - because it's Long - not long
LazyCollection!User users; // @OneToMany by default
// annotation required, otherwise would be deduced as
@ManyToOne
// @JoinColumn is required on one of OneToOne sides
@OneToOne @JoinColumn CustomerOptions customerOptions;
}
// @Entity assumed
class CustomerOptions {
int id;
// annotation required, otherwise would be deduced as
@ManyToOne
@OneToOne Customer customer;
}
// @Entity assumed since no @Embeddable annotation
class Role {
int id; // @Generated
string name; // @NotNull
// annotation required, otherwise would be deduced as
@OneToMany
@ManyToMany LazyCollection!User users;
}
Aliases added, to simple put uppercase Long instead of
Nullable!long in code:
alias Nullable!byte Byte;
alias Nullable!ubyte Ubyte;
alias Nullable!short Short;
alias Nullable!ushort Ushort;
alias Nullable!int Int;
alias Nullable!uint Uint;
alias Nullable!long Long;
alias Nullable!ulong Ulong;
alias Nullable!float Float;
alias Nullable!double Double;
alias Nullable!DateTime NullableDateTime;
alias Nullable!Date NullableDate;
alias Nullable!TimeOfDay NullableTimeOfDay;
String (uppercase nullable version of string) is defined as
struct wrapper around string field, with interface similar to
Nullable!
Looks ugly, but I tried `typedef string String`, but it is
deprecated; `alias string String` cannot be distinguished from
just string. How to define String better? Is there a good way to
define String to be compatible with string, but with the ability
to distinguish between string and String in compile time?
More information about the Digitalmars-d-announce
mailing list