i think the simplest way to describe is show it by an example:
| fieldname | type | description |
|---|---|---|
| id | int | primary key |
| id_address | int | reference to table 'address' |
| login_name | char(20) | users login name |
| password | char(8) | users password |
| fieldname | type | description |
|---|---|---|
| id | int | primary key |
| name1 | varchar(30) | name 1 |
| name2 | varchar(30) | name 2 |
| street | varchar(30) | street |
| zip | char(6) | zip code |
| city | varchar(30) | city |
@Entity
@Table(name = "users")
public class User
{
private long id;
private Address address;
private String loginName;
private String password;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", nullable = false, length = 20)
public long getId()
{
return id;
}
public void setId(long id)
{
this.id = id;
}
@Basic
@Column(name = "login_name", nullable = false, length = 8, unique = true)
@Validate("required")
public String getLoginName()
{
return loginName;
}
public void setLoginName(String loginName)
{
this.loginName = loginName;
}
@Basic
@Column(name = "password", length = 32, nullable = false)
@Validate("required,minlength=4")
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
@ManyToOne(targetEntity = Address.class)
@Fetch(value = FetchMode.JOIN)
@Cascade(value = {org.hibernate.annotations.CascadeType.SAVE_UPDATE,
org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
@JoinColumn(name = "id_address", nullable = false)
public Address getAddress()
{
return address;
}
public void setAddress(String address)
{
this.address = address;
}
}
@Entity
@Table(name = "address")
public class Address
{
private long id;
private String name1;
private String name2;
private String street;
private String zip;
private String city;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", nullable = false, length = 20)
public long getId()
{
return _id;
}
public void setId(long id)
{
_id = id;
}
@Basic
@Column(name = "name_1", nullable = false, length = 30)
@Validate("required")
public String getName1()
{
return name1;
}
public void setName1(String name1)
{
this.name1 = name1;
}
@Basic
@Column(name = "name_2", nullable = false, length = 30)
public String getName2()
{
return name2;
}
public void setName2(String name2)
{
this.name2 = name2;
}
@Basic
@Column(name = "street", nullable = false, length = 30)
public String getStreet()
{
return street;
}
public void setStreet(String street)
{
this.street = street;
}
@Basic
@Column(name = "zip", nullable = false, length = 6)
public String getZip()
{
return zip;
}
public void setZip(String zip)
{
this.zip = zip;
}
@Basic
@Column(name = "city", nullable = false, length = 30)
public String getCity()
{
return city;
}
public void setCity(String city)
{
this.city = city;
}
}
public interface UserDAO extends GenericDAO<User, Long>
{
List<User> findAllOrderedByLoginName();
List<User> findByPartialName(String partialName);
}
public interface AddressDAO extends GenericDAO<Address, Long>
{
}
public class UserDAOHibernate extends AbstractHibernateDAO<User, Long> implements UserDAO
{
public UserDAOHibernate(Logger logger, Session session)
{
super(logger, session);
}
public List<User> findAllOrderedByLoginName()
{
return findAll("loginName");
}
public List<User> findByPartialName(String partialName)
{
SQLString sqlString = new SQLString("FROM Users users");
if (partialName != null && partialName.length() > 0)
sqlString.addWhereClause("users.address.name1 LIKE '" + partialName + "%'");
return findByQuery(sqlString.toString());
}
@Override
public void preDoSave(User entity)
{
Address address = entity.getAddress();
if (address.getZip().equals("999999"))
throw new RuntimeException("Zip-Code cant be '999999'");
}
}
public class AddressDAOHibernate extends AbstractHibernateDAO<Address, Long> implements AddressDAO
{
public AddressDAOHibernate(Logger logger, Session session)
{
super(logger, session);
}
}
add UserDAOHibernate as service to Tapestry5 IOC and say hibernate, where to find your entities.
public static void contributeHibernateEntityPackageManager(Configuration<String> configuration)
{
configuration.add("your.appl.package.entities");
}
/**
* bind all used DAOs.
*
* @param binder the service binder
*/
public static void bind(ServiceBinder binder)
{
binder.bind(UserDAO.class, UserDAOHibernate.class);
binder.bind(AddressDAO.class, AddressDAOHibernate.class);
}
now we are ready to access the user entity by his DAO class.
UserDAO userDAO = iocRegistry.getService(UserDAO.class);
User user = new User();
user.setLoginName("username");
user.setPassword("my_secret");
user.setActive(true);
Address address = new Address();
address.setName1("John");
address.setName2("Doe");
address.setStreet("NoStreet");
address.setZip("999999");
address.setCity("NoCity");
user.setAddress(address);
userDAO.doSave(user);