Cześć!
Mam sobie 2 encje (kod poniżej): Author
i Message
. Każdy autor ma wiele wiadomości. Chciałbym, aby po dodaniu wiadomości do bazy była ona widoczna z poziomu autora. Po wykonaniu kodu z klasy Main
otrzymuję:
Messages
Message{id=1, author=1, content='New Message', sendingTime=Mon Nov 12 01:07:28 CET 2018}
Authors
Author(id=1, username=Username, password=Password, messages=[Message{id=1, author=1, content='New Message', sendingTime=Mon Nov 12 01:07:28 CET 2018}])
[main] INFO com.burdzi0.SimpleChat.listener.Slf4jMessageLogListener - Saved message: Message{id=2, author=1, content='Second message', sendingTime=Mon Nov 12 01:07:28 CET 2018}
Authors
Author(id=1, username=Username, password=Password, messages=[Message{id=1, author=1, content='New Message', sendingTime=Mon Nov 12 01:07:28 CET 2018}])
Dlaczego po drugim wykonaniu zapytania do bazy o autorów nie są widoczne wszystkie jego wiadomości?
Kod
@Data
@NoArgsConstructor
@Entity
@EntityListeners(Slf4jAuthorLogListener.class)
@NamedQueries({
@NamedQuery(
name = "Author.ByUsername",
query = "SELECT a FROM Author a WHERE a.username LIKE :username"
),
@NamedQuery(
name = "Author.All",
query = "SELECT a FROM Author a"
)
})
public class Author {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String password;
@OneToMany(mappedBy = "author", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<Message> messages;
public Author(String username, String password) {
this.username = username;
this.password = password;
}
public Author(String username, String password, List<Message> messages) {
this.username = username;
this.password = password;
this.messages = messages;
}
}
oraz
@Data
@NoArgsConstructor
@Entity
@EntityListeners(Slf4jMessageLogListener.class)
@NamedQueries({
@NamedQuery(
name = "Message.All",
query = "SELECT m FROM Message m"
),
@NamedQuery(
name = "Message.FindByContent",
query = "SELECT m FROM Message m WHERE m.content like :content"
)
})
public class Message {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "author_fk")
private Author author;
private String content;
@Column(name = "sending_timestamp")
@Temporal(TemporalType.TIMESTAMP)
private Date sendingTime;
public Message(Author author, String content, Date sendingTime) {
this.author = author;
this.content = content;
this.sendingTime = sendingTime;
}
@Override
public String toString() {
return "Message{" +
"id=" + id +
", author=" + author.getId() +
", content='" + content + '\'' +
", sendingTime=" + sendingTime +
'}';
}
}
W klasie Main sobie testuję co udało mi się utworzyć:
public class Main {
public static void main(String[] args) {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("IRC");
EntityManager manager = factory.createEntityManager();
EntityTransaction transaction = manager.getTransaction();
AuthorRepository authorRepository = new InMemoryAuthorRepository(manager);
MessageRepository messageRepository = new InMemoryMessageRepository(manager);
Author author = new Author("Username", "Password");
Message message = new Message(author, "New Message", new Date());
author.setMessages(new ArrayList<>() {{add(message);}});
authorRepository.saveAuthor(author);
System.out.println("Messages");
messageRepository.getAllMessages().forEach(System.out::println);
System.out.println("Authors");
authorRepository.getAllAuthors().forEach(System.out::println);
Message message1 = new Message(author, "Second message", new Date());
messageRepository.saveMessage(message1);
System.out.println("Authors");
authorRepository.getAllAuthors().forEach(System.out::println);
manager.close();
factory.close();
}
}
Plik persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="IRC" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<class>com.burdzi0.SimpleChat.model.Message</class>
<class>com.burdzi0.SimpleChat.model.Author</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />
<property name="javax.persistence.jdbc.url" value="jdbc:h2:file:/home/Burdzi0/IdeaProjects/SimpleChat/src/DATABASE" />
<property name="hibernate.hbm2ddl.auto" value="create" />
<!-- <property name="hibernate.show_sql" value="true" /> -->
</properties>
</persistence-unit>
</persistence>
Dzięki!