Nie rozumiem problem, który masz, choć nie bardzo niewiele zmian w kodzie, więc może pracować z moja konfiguracja.
/META-INF/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="hibernate-entitymanager-demo" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/hibernate4?zeroDateTimeBehavior=convertToNull"/>
<property name="javax.persistence.jdbc.password" value="root"/>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
<!-- property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/ -->
</properties>
</persistence-unit>
</persistence>
Main.java przypadki tutaj (dwa użytku: albo createFriendships zainicjować jakieś dane lub findMembers dla problematycznej przypadku użycia zwrócić uwagę. własność javax.persistence.schema-generation.database.action
w persistence.xml jak będziemy chcieli, aby utworzyć bazę danych w pierwszym, ale nie w tym ostatnim)
public class Main {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hibernate-entitymanager-demo");
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin();
// createFriendships(em);
findMembers(em);
transaction.commit();
em.close();
emf.close();
}
private static void findMembers(EntityManager em) {
List<Member> list = em.createQuery("from Member").getResultList();
for (Member m : list) {
System.out.println(m);
}
}
private static void createFriendships(EntityManager em) {
List<Member> members = createMembers(em);
for (int i = 0; i < members.size(); i++) {
for (int j = 0; j < members.size(); j++) {
if (i != j) {
createFriendship(em, members.get(i), members.get(j));
}
}
}
}
private static List<Member> createMembers(EntityManager em) {
List<Member> members = new ArrayList<>();
members.add(createMember(em, "Roberta", "Williams", "rwilliams"));
members.add(createMember(em, "Ken", "Williams", "kwilliams"));
members.add(createMember(em, "Dave", "Grossman", "dgrossman"));
members.add(createMember(em, "Tim", "Schafer", "tschafer"));
members.add(createMember(em, "Ron", "Gilbert", "rgilbert"));
return members;
}
private static Member createMember(EntityManager em, String fname, String lname, String username) {
Member m = new Member();
m.setFname(fname);
m.setLname(lname);
m.setUsername(username);
em.persist(m);
return m;
}
private static void createFriendship(EntityManager em, Member requester, Member friend) {
Friendship f = new Friendship();
f.setActive(true);
f.setDate(new Date());
f.setRequester(requester);
f.setFriend(friend);
em.persist(f);
}
}
Główne produkuje:
Member [fname = Roberta, lname = Williams, requests = 4, friends = 4]
Member [fname = Ken, lname = Williams, requests = 4, friends = 4]
Member [fname = Dave, lname = Grossman, requests = 4, friends = 4]
Member [fname = Tim, lname = Schafer, requests = 4, friends = 4]
Member [fname = Ron, lname = Gilbert, requests = 4, friends = 4]
Friendship.java Prawdziwy rzeczywista zmiana był określany nazwą kolumny, które zostały zmienione od username
do id
jak mam could not get a field value by reflection
rodzaju wyjątku. Obok myślę, że lepiej w zakresie normalizacji bazy danych:
@Entity
@Table(name = "FRIENDSHIPS")
public class Friendship implements Serializable {
@Id
@ManyToOne
@JoinColumn(referencedColumnName = "id")
Member requester;
@Id
@ManyToOne
@JoinColumn(referencedColumnName = "id")
Member friend;
@Temporal(javax.persistence.TemporalType.DATE)
Date date;
@Column(nullable = false)
boolean active;
// getters & setters
}
Member.java (tu bez zmian, z wyjątkiem toString()
)
@Entity
@Table(name = "MEMBERS")
public class Member implements Serializable {
@Id
@GeneratedValue
private long id;
@Column(name = "username", nullable = false, unique = true)
private String username;
@Column(nullable = false)
private String fname;
@Column(nullable = false)
private String lname;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "requester")
private Set<Friendship> friendRequests = new HashSet<>();
@OneToMany(fetch = FetchType.EAGER, mappedBy = "friend")
private Set<Friendship> friends = new HashSet<>();
// getters & setters
@Override
public String toString() {
return "Member [fname = " + fname + ", lname = " + lname
+ ", requests = " + friendRequests.size()
+ ", friends = " + friends.size() + "]";
}
}
Najlepszym sposobem jest utrzymywanie kolejnego stołu z prośbą o przyjaciela, a dla przyjaźni istnieje tabela, która zawiera tylko ID nadawcy i odbiorcę. –
Czy możesz tutaj umieścić swój kod testu? –
@NiravChhatrola Nie mam jeszcze żadnego przypadku testowego. –