<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>SubscriptionMatch.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">jUDDI Core - OpenJPA</a> &gt; <a href="index.source.html" class="el_package">org.apache.juddi.model</a> &gt; <span class="el_source">SubscriptionMatch.java</span></div><h1>SubscriptionMatch.java</h1><pre class="source lang-java linenums">/*
 * Copyright 2001-2008 The Apache Software Foundation.
 * 
 * Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */
package org.apache.juddi.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

/**
 * @author &lt;a href=&quot;mailto:jfaath@apache.org&quot;&gt;Jeff Faath&lt;/a&gt;
 */
@Entity
@Table(name = &quot;j3_subscription_match&quot;)
public class SubscriptionMatch implements java.io.Serializable {

	private static final long serialVersionUID = -7603419240922639070L;
	private Long id;
	private Subscription subscription;
	private String entityKey;

<span class="fc" id="L41">	public SubscriptionMatch() {</span>
<span class="fc" id="L42">	}</span>
	
<span class="fc" id="L44">	public SubscriptionMatch(Subscription subscription, String entityKey) {</span>
<span class="fc" id="L45">		this.subscription = subscription;</span>
<span class="fc" id="L46">		this.entityKey = entityKey;</span>
<span class="fc" id="L47">	}</span>

	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	public Long getId() {
<span class="fc" id="L52">		return id;</span>
	}
	public void setId(Long id) {
<span class="fc" id="L55">		this.id = id;</span>
<span class="fc" id="L56">	}</span>

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = &quot;subscription_key&quot;, nullable = false)
	public Subscription getSubscription() {
<span class="fc" id="L61">		return subscription;</span>
	}
	public void setSubscription(Subscription subscription) {
<span class="fc" id="L64">		this.subscription = subscription;</span>
<span class="fc" id="L65">	}</span>

	@Column(name = &quot;entity_key&quot;, nullable = false)
	public String getEntityKey() {
<span class="fc" id="L69">		return entityKey;</span>
	}
	public void setEntityKey(String entityKey) {
<span class="fc" id="L72">		this.entityKey = entityKey;</span>
<span class="fc" id="L73">	}</span>

	
	
}
</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.7.9.201702052155</span></div></body></html>