big sample

i think the simplest way to describe is show it by an example:

your database table 'users' and 'address'

users
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

address
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

your entities for table 'users' and 'address'

                    
@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;
    }
}

                

your DAO interface for entities User and Address

                    
public interface UserDAO extends GenericDAO<User, Long>
{
    List<User> findAllOrderedByLoginName();

    List<User> findByPartialName(String partialName);
}

public interface AddressDAO extends GenericDAO<Address, Long>
{
}

                

your hibernate based implementation for UserDAO and AddressDAO

                    
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);
    }
}

                

inject the DAO into your application

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);
}

                

accessing the DAO from application code

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);