Java @不创建相应表的CollectionFements

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

编辑

大家好

我想得到的

我想要一个代表个人详细信息列表的表,该表称为PERSON,必须有以下列:

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() {
}

...