@Entity -- 声明为一个实体bean @Table(name="promotion_info") --为实体bean映射指定表(表名="promotion_info) @Id --声明了该实体 bean的标识属性 @GeneratedValue -- 可以定义标识字段的生成策略. @Transient -- 将忽略这些字段和属性,不用持久化到数据库 @Column(name="promotion_remark")-- 声明列(字段名="promotion_total") 属性还包括(length=200等) @Temporal(TemporalType.TIMESTAMP)--声明时间格式 @Enumerated -- 声明枚举 @Version -- 声明添加对乐观锁定的支持 @OneToOne -- 可以建立实体bean之间的一对一的关联 @OneToMany --可以建立实体 bean之间的一对多的关联 @ManyToOne -- 可以建立实体bean之间的多对一的关联 @ManyToMany --可以建立实体 bean之间的多对多的关联 @Formula -- 一个SQL表达式,这种属性是只读的,不在数据库生成属性(可以使用sum、average、max等) @OrderBy --Many端某个字段排序(List) @Embedded @Entity @Table(name="promotion_info") public class Promotion implements Serializable { //AUTO--可以是identity类型的字段,或者sequence类型或者table类型,取决于不同的底层数据库 @Id @GeneratedValue(strategy = GenerationType.AUTO) //对于oracle想使用各自的Sequence: //@GeneratedValue(strategy = GenerationType.AUTO,generator="PROMOTION_SEQ") //@SequenceGenerator(name="PROMOTION_SEQ",sequenceName="PROMOTION_SEQ") private Long id; @Column(name="group_start_amount") private Integer groupStartAmount=0; @Column(name="promotion_remark",length=200) //@Lob 如果是文章内容可以使用 只需要把length=200去掉就可以了 private String remark; //DATE - java.sql.Date //TIME - java.sql.Time //TIMESTAMP - java.sql.Timestamp @Temporal(TemporalType.TIMESTAMP) @Column(name="start_time") private Date startTime; //显示0 隐藏1 public static enum DisplayType { 显示,隐藏 } @Enumerated(value = EnumType.ORDINAL)//ORDINAL序数 private DisplayType displayType = DisplayType. 显示; @Version private Integer version; //CascadeType.PERSIST -- 触发级联创建(create) //CascadeType.MERGE -- 触发级联合并(update) //FetchType.LAZY -- 延迟加载 @ManyToOne(cascade = {CascadeType.PERSIST,CascadeType.MERGE},fetch = FetchType.LAZY) private PromotionGroup promotionGroup; //单向ManyToMany //@JoinTable(关联的表名) //joinColumns -- promotion关联的列的外键 //inverseJoinColumns -- largess 关联列的外键 @ManyToMany(cascade = {CascadeType.PERSIST,CascadeType.MERGE}) @JoinTable(name="promotion_largess",joinColumns={@JoinColumn(name="promotion_id")},inverseJoinColumns={@JoinColumn(name="largess_id")}) private Set<Largess> largess; @OneToMany(mappedBy="promotion",cascade = CascadeType.ALL) @OrderBy("quantity asc")//item中的列表会根据quantity排序 private List<PromotionItem> promotionItem; //get set 省略.... @Transient private Long hashcodeValue = null; public synchronized int hashCode() { if(hashcodeValue = null) { if(id == null) hashcodeValue = new Long(super.hashCode()); else hashcodeValue = id; } return hashcodeValue.intValue(); } public boolean equals(Object obj) { Promotion other = (Promotion) obj; if(this == other) return true; if(this.id == null || other.id == null) return false; return this.id.equals(other.id); } } @Entity @Table(name="promotion_group") public class PromotionGroup implements Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; //mappedBy的值"promotionGroup"指向owner(Promotion)端的关联属性,并且是双向关系 @OneToMany(mappedBy="promotionGroup",cascade=CascadeType.ALL) private List<Promotion> promotion; //get set 省略.... } @Entity @Table(name="largess") public class Largess implements Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; //1.sql语句中的字段和表名都应该和数据库相应,而不是类中的字段, //若带有参数如la.id= id,这个=id才是类中属性 //2.操作字段一定要用别名 @Formula(select max(la.id) from largess as la) private int maxId; @Formula(select COUNT(la.id) from largess la) private int count; @Transient private String img //get set 省略.... } @SuppressWarnings("serial") @Entity @Table(name = "Personal") @SequenceGenerator(name = "PERSONAL_SEQ", sequenceName = "PERSONAL_SEQ") public class Personal implements Serializable { private int id; private String name; @Embedded @AttributeOverrides({ @AttributeOverride(name="street",column=@Column(name="home_street")), @AttributeOverride(name="city",column=@Column(name="home_city")), @AttributeOverride(name="province",column=@Column(name="home_province")), @AttributeOverride(name="zipcode",column=@Column(name="home_zipcode")) }) private Address homeAddress; @Embedded @AttributeOverrides({ @AttributeOverride(name="street",column=@Column(name="com_street")), @AttributeOverride(name="city",column=@Column(name="com_city")), @AttributeOverride(name="province",column=@Column(name="com_province")), @AttributeOverride(name="zipcode",column=@Column(name="com_zipcode")) }) private Address comAddress; public Personal(){} public Personal(String name,Address homeAddress,Address comAddress){ this.name = name; this.homeAddress = homeAddress; this.comAddress = comAddress; } public Address getComAddress() { return comAddress; } public void setComAddress(Address comAddress) { this.comAddress = comAddress; } public Address getHomeAddress() { return homeAddress; } public void setHomeAddress(Address homeAddress) { this.homeAddress = homeAddress; } @Id @GeneratedValue(generator="PERSONAL_SEQ") public int getId() { return id; } @SuppressWarnings("unused") private void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } @SuppressWarnings("serial") @Embeddable public class Address implements Serializable { private String street; private String city; private String province; private String zipcode; public Address() { // TODO Auto-generated constructor stub } public Address(String street,String city,String province,String zipcode){ this.street = street; this.city = city; this.province = province; this.zipcode = zipcode; } @Column(name="city",insertable=false, updatable=false) public String getCity() { return city; } public void setCity(String city) { this.city = city; } @Column(name="province",insertable=false, updatable=false) public String getProvince() { return province; } public void setProvince(String province) { this.province = province; } @Column(name="street",insertable=false, updatable=false) public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } @Column(name="zipcode",insertable=false, updatable=false) public String getZipcode() { return zipcode; } public void setZipcode(String zipcode) { this.zipcode = zipcode; } }