On 2013-04-05 09:32, Vadim Lopatin wrote:

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;
}

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?

Why won't Nullable!(string) String work?

Looks much better know. I'm wondering though, if there need to be a way to indicate a regular instance variable that isn't a column.

--
/Jacob Carlborg

Reply via email to