Java @不创建相应表的CollectionFements
编辑 大家好 我想得到的 我想要一个代表个人详细信息列表的表,该表称为PERSON,必须有以下列:Java @不创建相应表的CollectionFements,java,hibernate,jpa,annotations,Java,Hibernate,Jpa,Annotations,编辑 大家好 我想得到的 我想要一个代表个人详细信息列表的表,该表称为PERSON,必须有以下列: ID NAME SURNAME STREET ID_CITY ID COUNTRY PROVINCE NAME 嗯,我的数据库中已经有一个表,其中包含我国的所有市镇,该表称为市镇,有以下列: ID NAME SURNAME STREET ID_CITY ID COUNTRY
ID NAME SURNAME STREET ID_CITY
ID COUNTRY PROVINCE NAME
嗯,我的数据库中已经有一个表,其中包含我国的所有市镇,该表称为市镇,有以下列:
ID NAME SURNAME STREET ID_CITY
ID COUNTRY PROVINCE NAME
我编写了类university.java来重新显示上表,这个类是:
@Entity
public class Municipality implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
private String country;
private String province;
private String name;
public Municipality() {
}
...
所以,我认为PERSON表的一个好实现是编写一个eMebedd类Address.java,其中包含一些关于PERSON的“地址”的信息,以嵌入PERSON.java类中。
Address.javasimpy包含街道和市政对象:
@Embeddable
public class Address implements Serializable {
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="ID_CITY")
@Cascade(CascadeType.SAVE_UPDATE)
private Municipality municipality;
@Column(length=45)
private String street;
public Address() {
}
...
地址简单地嵌入到Person.java类中:
@Entity
public class Person implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
private String name;
private String surname;
@Embedded
private Address address;
public Person() {
}
...
那么,如果现在我保存一个Person实例:
Person p=new Person();
Address a=new Address();
a.setStreet("bla bla");
Municipality mun=new Municipality();
mun.setName("ZZZ");
a.setMunicipality(mun);
p.setAddress(a);
session.save(p);
一切正常,hibernate创建一个完全符合我要求的表格
问题 但是现在,我还需要与市政对象关联的所有地址的列表,因此我不需要为此进行“选择”。 我认为我的好办法是在市政当局增加一个地址集合:
@CollectionOfElements
private List<Address> addressList;
上表始终包含空值。。。所以这完全没用,我不想要它
我读了一些关于@CollectionFelments和@OneToMany的文档,发现我可以定义一个联接表。所以我想设置像join table这样的人
@CollectionOfElements
@JoinTable(name="PERSON")
private List<Address> addressList;
Uid总是包含空值,那么为什么要添加此列呢
当然,我的实现非常糟糕,我对hibernate和JPA还不熟悉,那么我的主要错误在哪里呢
我希望现在更容易理解。。。对不起,我的英语不好
谢谢。我不确定预期结果到底是什么(我懒得重复这个案例),但您应该能够得出以下示例:
@org.hibernate.annotations.CollectionOfElements(targetElement = java.lang.String.class)
@JoinTable( name="PHONE",joinColumns = @JoinColumn(name="STUDENT_ID"))
@Column(name="PHONE_NO")
public Set<String> getPhones() {
@org.hibernate.annotations.CollectionFements(targetElement=java.lang.String.class)
@JoinTable(name=“PHONE”,joinColumns=@JoinColumn(name=“STUDENT\u ID”))
@列(name=“电话号码”)
公共设置getPhones(){
blow,如果您真的不想要地址列表表,您应该使用@Transient而不是@collectionfeements
public class Municipality {
@Transient
private List<Address> addressList;
}
现在,我们的地址
/*
* @Embeddable class MUST implements Serializable
*/
@Embeddable
public class Address implements Serializable {
@ManyToOne
/*
* If you are using Hibernate INSTEAD OF JPA
* Prefer to use @Cascade Hibernate annotation, as shown bellow,
* instead of JPA cascade Attribute
*
* Also notice it can not be null - see nullable Attribute
*/
@Cascade(CascadeType.SAVE_UPDATE)
@JoinColumn(name="MUNICIPALITY_ID", nullable=false)
private Municipality municipality;
}
和市政当局(无任何地址或人员列表)
如上所示,您的DB结构应该如下所示
PERSON
ID
MUNICIPALITY_ID
MUNICIPALITY
ID
但市政府是否有如下人员名单
public class Municipality {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@OneToMany
private List<Person> personList;
}
你会看到
INSERT INTO PERSON blah, blah, blah...
因为@Cascade(保存更新)
但是由于双向关系,你应该设置哪个属性是关系的所有者。关系的所有者?那是什么
假设
public class A {
@ManyToOne
private B b;
}
及
SQL输出
/* Let's suppose B_ID generated value is 5
INSERT INTO B
/*
* because of @Cascade(SAVE_UPDATE)
INSERT INTO A (B_ID) VALUES(5)
但是因为a.getB()是空的
你也会看到
UPDATE A SET B_ID = null
它解释了为什么在使用双向关系时应该使用mappedBy属性。最后,我想找到一个解决方案……我这样做:
@Entity
public class Municipality implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
private String country;
private String province;
private String name;
@OneToMany(mappedBy="address.municipality")
private List<Person> persons;
public Municipality() {
}
...
@实体
公共类实现可序列化{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
私人国家;
私人弦省;
私有字符串名称;
@OneToMany(mappedBy=“地址.市政当局”)
私人名单人员;
公共市政当局(){
}
...
我没有换别的课
这是正确的还是只是偶然的
谢谢。我试过:@collectionfements@JoinTable(name=“person”,joinColumns=@JoinColumn(name=“id\u”))private List addressList;但在hibernate javadoc中无法正常工作关于targetElement:仅当集合不使用genericsHi!嗯…@transient不是我想要的。我编辑了我的帖子,希望能更好地解释这种情况。我知道你可以帮我!!谢谢你,我想我已经做到了明白!你说得很清楚。这似乎是对的!但根据你自己提供的答案,你在个人和市政府之间有着双向关系(通过@Embeddeble Address),它需要mappedBy属性。请注意,当使用双向关系时,最好使用添加便利方法来设置双方。请记住这一点
public class A {
@ManyToOne
private B b;
}
public class B {
@OneToMany
@JoinColumn(name="B_ID")
@Cascade(SAVE_UPDATE)
private List<A> aList;
}
/*
* a.getB() is null, right ?
A a = new A();
B b = new B();
b.getAList().add(a);
/* Let's suppose B_ID generated value is 5
INSERT INTO B
/*
* because of @Cascade(SAVE_UPDATE)
INSERT INTO A (B_ID) VALUES(5)
UPDATE A SET B_ID = null
@Entity
public class Municipality implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
private String country;
private String province;
private String name;
@OneToMany(mappedBy="address.municipality")
private List<Person> persons;
public Municipality() {
}
...