8

私はJPAに慣れようとしているので、非常に単純なプロジェクトを作成しました。UserクラスとAddressクラスがあります。UserクラスにAddressを追加しているのに、両方を永続化する必要があるようです。

ユーザー:

import javax.persistence.*;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

@Entity
@Table(name = "usr") // @Table is optional, but "user" is a keyword in many SQL variants 
@NamedQuery(name = "User.findByName", query = "select u from User u where u.name = :name")
public class User {
    @Id // @Id indicates that this it a unique primary key
    @GeneratedValue // @GeneratedValue indicates that value is automatically generated by the server
    private Long id;

    @Column(length = 32, unique = true)
    // the optional @Column allows us makes sure that the name is limited to a suitable size and is unique
    private String name;

    // note that no setter for ID is provided, Hibernate will generate the ID for us

    @OneToMany(fetch=FetchType.LAZY, mappedBy="user")
    private List<Address> addresses;

住所:

@Entity
public class Address {

    @Id // @Id indicates that this it a unique primary key
    @GeneratedValue // @GeneratedValue indicates that value is automatically generated by the server
    private Long id;

    @Column(length=50)
    private String address1;

    @ManyToOne
    @JoinColumn(name="user_id")
    private User user;

EntityManager:

EntityManager entityManager = Persistence.createEntityManagerFactory("tutorialPU").createEntityManager();

entityManager.getTransaction().begin();

User user = new User();
user.setName("User");

List<Address> addresses = new ArrayList<Address>();
Address address = new Address();
address.setAddress1("Address1");

addresses.add(address);
user.setAddresses(addresses);
entityManager.persist(user);
entityManager.persist(address);
entityManager.getTransaction().commit();
entityManager.close();

おそらく何か間違ったことをしています...それが何であるかわからないのですか?

任意の提案をいただければ幸いです。

ありがとう、

S

4

3 に答える 3

13

cascade注釈の要素を試してください。

@OneToMany(fetch=FetchType.LAZY, mappedBy="user", cascade=CascadeType.PERSIST) 
private List<Address> addresses; 

ドキュメントには、デフォルトでは操作はカスケードされないと記載されています。また、カスケード操作はオプションであると述べているため、実際には使用している実装によって異なります。

また、関係を設定するときは、必ず関係の両側を設定してください。ユーザーにアドレスを設定し、アドレスにユーザーを設定します。

于 2012-09-28T14:32:38.630 に答える
7

あなたが話しているのはカスケードと呼ばれています。つまり、のなど、ネストされたオブジェクトに対して同じアクションを実行することを意味AddressしますUser。デフォルトでは、を指定しない場合、カスケードはまったくありませんCascadeType

さまざまなカスケードタイプを一度に定義できます

@OneToMany(fetch=FetchType.LAZY, mappedBy="user", cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE})
private List<Address> addresses;

または、JPAにすべての操作をカスケードするように指示します。

@OneToMany(fetch=FetchType.LAZY, mappedBy="user", cascade = CascadeType.ALL)
private List<Address> addresses;

どちらの方法でも、たとえば、Addressを永続化するときに永続化されるか、が削除されたときにUser関連付けられたものが削除されます。AddressUser

しかし!...CascadeType.REMOVE最初の例から削除した場合、User削除しても関連するものは削除Addressされません(削除操作はネストされたオブジェクトには適用されません)。

于 2012-09-28T14:37:34.607 に答える
0

oneToManyアノテーションを使用しています。私の理解では、子クラス(Address)を追加する場合は、親クラス(USer)を永続化する必要があります。

Userクラスを永続化することで、更新する行をJPAに通知します。

于 2012-09-28T14:32:58.180 に答える