JPA不维护连接

时间:2015-02-21 23:44:16

标签: java jpa eclipselink

所以看起来一旦程序结束,对象连接就不会持久化。让我用一个简单的例子来解释:

//向朋友添加朋友并向该朋友发送消息。

em.getTransaction().begin();

Friend person = new Friend();
person.setName("One");

Friend friend = new Friend();
friend.settName("Two");

Message messageToFriend = new Message();
messageToFriend.setMessage("Hi");

friend.getMessages().add(messageToFriend);

person.getFriends().add(friend);

em.persist(person);

em.getTransaction().commit();

//测试代码:

Query q = em.createQuery("select f from Friend f where f.name = 'One'");
List<Friend> personList = q.getResultList();

Friend retrievedPerson = personList.get(0);

System.out.println("Friend size: "+retrievedPerson.getFriends().size());
if(retrievedPerson.getFriends().size() > 0){
    List<Message> messagesToFriend = retrievedPerson.getFriends().get(0).getMessages();

    System.out.println("Friend message size: "+messagesToFriend.size());

    if(messagesToFriend.size() > 0){
        System.out.println("Message to "+retrievedPerson.getFriends().get(0).getName()+": "+messagesToFriend.get(0).getMessage());
    }
}

这将按预期打印:

朋友人数:1

朋友留言大小:1

给二的消息:嗨

但是一旦程序结束,我再次尝试测试代码:

朋友人数:0

如果我进行查询以获取所有朋友,我会得到两个朋友:一个和两个,但两者之间的联系已经消失。甚至朋友的消息也消失了(虽然它仍然在数据库中并且查询消息获取消息)。

为什么对象之间的连接会丢失?

我正在使用MySQL和EclipseLink。

附加代码:

 @Entity
    public class Friend {

        @Id
        @GeneratedValue(strategy = GenerationType.TABLE)
        public String id;

        private String name;

        @OneToMany(mappedBy="parentFriend", cascade = CascadeType.PERSIST)
        private List<Friend>friends = new ArrayList<Friend>();

        @ManyToOne
        private Friend parentFriend;

        @OneToMany(mappedBy="friend", cascade = CascadeType.PERSIST)
        private List<Message>messages = new ArrayList<Message>();

        public List<Message>getMessages(){
            return messages;
        }

        public List<Friend>getFriends(){
            return friends;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

    }

@Entity
public class Message {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private String id;

    @ManyToOne
    private Friend friend;

    private String message;

    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
}

2 个答案:

答案 0 :(得分:0)

提交后可能需要em.flush()。 JPA不保证数据何时实际持久保存到数据库。我相信em.flush()方法将明确地保留它,假设您还不想关闭实体管理器。

答案 1 :(得分:0)

对不起,在再次查看你的问题之后,我担心我的回答不正确。我认为问题是因为您的代码没有交叉链接朋友和parentFriend字段。您的代码看起来应该更像:

Friend a = new Friend();
Friend b = new Friend();
a.getFriends().add(b);
b.setParentFriend(a);

如果没有设置两个字段,即使使用持久级联,也不会发生链接。