I have two classes :
@Entity
public class Player
{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String nick;
@ManyToOne
private Team team;
}
and
@Entity
public class Team
{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String name;
@OneToMany(mappedBy = "team")
private List<Player> players = new ArrayList<>();
@Transient
public void addPlayer(Player player)
{
if (player != null)
players.add(player);
}
}
and in controller I add one team and one player to database
private void addTeams()
{
Team team = new Team();
team.setName("Name");
Player p = new Player();
team.addPlayer(p);
teamsService.addTeam(team);
playersService.addPlayer(p);
}
Abstact Dao class :
package eniupage.domain.repository.impl;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import javax.inject.Inject;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.transaction.annotation.Transactional;
import eniupage.domain.repository.Dao;
public abstract class DaoImpl<T> implements Dao<T>
{
@Inject
private SessionFactory sessionFactory;
private Class<T> domainClass;
protected Session currentSession()
{
return sessionFactory.getCurrentSession();
}
@SuppressWarnings("unchecked")
private Class<T> getDomainClass()
{
if (domainClass == null)
{
ParameterizedType thisType = (ParameterizedType) getClass().getGenericSuperclass();
this.domainClass = (Class<T>) thisType.getActualTypeArguments()[0];
}
return domainClass;
}
private String getDomainClassName()
{
return getDomainClass().getName();
}
@Transactional
public void add(T t)
{
currentSession().save(t);
}
@Transactional
@SuppressWarnings("unchecked")
public List<T> getAll()
{
return currentSession().createQuery("from " + getDomainClassName()).list();
}
@Transactional
@SuppressWarnings("unchecked")
public T get(Serializable id)
{
return (T) currentSession().get(getDomainClass(), id);
}
@Transactional
@SuppressWarnings("unchecked")
public T load(Serializable id)
{
return (T) currentSession().load(getDomainClass(), id);
}
@Transactional
public long count()
{
return (Long) currentSession().createQuery("select count(*) from " + getDomainClassName()).uniqueResult();
}
}
I added to hibernate config hibernate.hbm2ddl.auto
as create-drop
In result I got two tables:
- Team table
- Player table with column team_id which is null.
Why team_id is null ? I did team.addPlayer(p)