Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Внешний ключ в Hibernate


Автор: Farik013 18.1.2016, 22:24
Доброе время суток.
POJO
Код

@Entity
@NamedQuery(name = "allOpers", query = "SELECT o FROM Opers o")
public class Opers {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String name;
    private String surname;
    @ManyToOne
    private Filials filials;
 
    public Opers() {
        super();
        // TODO Auto-generated constructor stub
    }
 
    public Opers(int id, String name, String surname, Filials filials) {
        super();
        this.id = id;
        this.name = name;
        this.surname = surname;
        this.filials = filials;
    }
 
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getSurname() {
        return surname;
    }
 
    public void setSurname(String surname) {
        this.surname = surname;
    }
 
    public Filials getFilials() {
        return filials;
    }
 
    public void setFilials(Filials filials) {
        this.filials = filials;
    }
 
    @Override
    public String toString() {
        return "Opers [id=" + id + ", name=" + name + ", surname=" + surname + ", filials=" + filials + "]";
    }
 
}


И есть страница
Код

<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Opers</title>
</head>
<body>
    <sf:form modelAttribute="opers"
        action="${pageContext.request.contextPath}/opers"
        method="GET">
        <table border="1" width="50%">
            <tr>
                <td>Id</td>
                <td>Name</td>
                <td>Surname</td>
            </tr>
            <c:forEach items="${Opers}" var="op">
                <tr>
                    <td>${op.id}</td>
                    <td>${op.name}</td>
                    <td>${op.surname}</td>
                </tr>
            </c:forEach>
        </table>
    </sf:form>
</body>
</html>


Контроллер 
Код

@Controller
public class OperController {
    @Autowired
    private OperService operService;
 
    @RequestMapping(value = "/opers/{filialId}", method = RequestMethod.GET)
    public ModelAndView getOpers(@PathVariable("filialId") int filialId) {
        ModelAndView model = new ModelAndView("opers");
        model.addObject("opers", operService.getOperByFilialId(filialId));
        return model;
    }
 
}


При вызове страницы из другой страницы
Код

<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form action="${pageContext.request.contextPath}/insert">
        <table border="1" width="50%">
            <tr>
                <th>Id</th>
                <th>Name</th>
                <th>Adress</th>
                <th></th>
                <th></th>
            </tr>
            <c:forEach items="${filials}" var="fil">
                <tr>
                    <td>${fil.id}</td>
                    <td><a
                        href="${pageContext.request.contextPath}/opers/${fil.id}">${fil.name}</a></td>
                    <td>${fil.adress}</td>
                    <td><a
                        href="${pageContext.request.contextPath}/update/${fil.id}">Update</a></td>
                    <td><a
                        href="${pageContext.request.contextPath}/delete?id=${fil.id}">Delete</a></td>
                </tr>
            </c:forEach>
        </table>
        <input type="submit" value="insert" name="btnInsert" />
    </form>
</body>
</html>


Мне не выводит данные которые связаны по внешнему ключу с другой таблицей, то есть контроллер не работает. Может я не совсем правильно выразился или может какие то данные не показал, вы скажите что еще добавить.

Автор: Farik013 19.1.2016, 13:45
Создав обычный класс, чтоб проверить работу метода

Код

public class TestApp {
    @Autowired
    static OperService operService;

    public static void main(String[] args) {

        Opers opers = operService.getOperByFilialId(2);
        System.out.println(opers);
    }
}


На выходе у меня дает 

Код

Exception in thread "main" java.lang.NullPointerException
    at az.nikoil.test.TestApp.main(TestApp.java:17)


Вот код метода

Код

@Override
    @Transactional
    public Opers getOperByFilialId(int filialId) {

        return operDAO.getOperByFilialId(filialId);
    }


В чем может быть проблема?

Автор: a0730 20.1.2016, 15:19
1. Покажи контроллер, который выкладывает filials в модель.
2. Чтобы @Autowired работал нужно создать контекст.


Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Vneshny-klyuch-v-Hibernate-id569d3c89ae20153e368b4567#findElement_E7045_569f7b60ae2015f5385f536d_0

Автор: Farik013 21.1.2016, 08:46
Контроллер который выкладывает filials

Код

@RequestMapping(value = "filials", method = RequestMethod.GET)
    public ModelAndView getFilials() {
        ModelAndView model = new ModelAndView("home");
        model.addObject("filials", filialService.getAllFilials());
        return model;
    }


Мне нужно, чтоб выводились opers

Автор: Farik013 6.2.2016, 16:54
Решил самостоятельно. Запрос работал неправильно. Написав вручную, все заработало как надо было.

Код

@Override
    public List<Opers> getOperByFilialId(int filialId) {
        return getSession().createQuery("FROM Opers where filials.id=" + filialId).list();
    }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)